// 导入lodash-es库中的debounce函数，用于防抖处理
import { debounce } from 'lodash-es'
// 导入vue-command库中的方法，用于创建标准错误输出、标准输出和文本格式化器
import { createStderr, createStdout, textFormatter } from 'vue-command'
// 导入自定义的helper.js文件中的useFixCursor方法，用于修正光标位置
import { useFixCursor } from './helper.js'

// 获取全局变量$gnirehtet，用于执行远程控制命令
const $gnirehtet = window.gnirehtet

/**
 * 导出一个名为useGnirehtet的函数，用于处理远程控制命令的执行
 * @param {Object} params - 包含vShell、history和loading属性的对象
 * @param {Object} vShell - 用于访问和操作Shell终端的Vue组件实例
 * @param {Object} history - Shell命令历史记录的状态管理对象
 * @param {Object} loading - 加载状态的响应式对象，用于控制加载中的显示
 * @returns {Object} - 返回一个包含gnirehtet方法的对象
 */
export function useGnirehtet({ vShell, history, loading } = {}) {
  /**
   * 定义一个异步函数gnirehtet，用于执行实际的远程控制命令
   * @param {Array} args - 命令行参数数组
   * @returns {Promise} - 返回一个Promise对象，表示命令执行的结果
   */
  const gnirehtet = async (args) => {
    // 设置加载状态为true
    loading.value = true

    // 从命令行参数中构建实际要执行的命令字符串
    const command = args.slice(1).join(' ')

    // 使用lodash-es的debounce函数对appendToHistory方法进行防抖处理，以优化性能
    const appendToHistory = debounce(vShell.value.appendToHistory, 500)

    // 初始化标准输出和标准错误输出的文本变量
    let stdoutText = ''
    let stderrText = ''

    // 执行远程控制命令，并传入stdout和stderr处理函数
    $gnirehtet.shell(command, {
      // 标准输出处理函数
      stdout(text) {
        // 设置加载状态为false
        loading.value = false

        // 累加标准输出文本
        stdoutText += text

        // 调用useFixCursor方法修正光标位置
        useFixCursor(history)

        // 将标准输出文本格式化后添加到命令历史记录中
        appendToHistory(createStdout(stdoutText))
      },
      // 标准错误输出处理函数
      stderr(text) {
        // 设置加载状态为false
        loading.value = false

        // 累加标准错误输出文本
        stderrText += text

        // 调用useFixCursor方法修正光标位置
        useFixCursor(history)

        // 将标准错误输出文本格式化后添加到命令历史记录中
        appendToHistory(createStderr(stderrText))
      },
    })

    // 返回格式化后的等待消息
    return textFormatter('Waiting...')
  }

  // 返回一个包含gnirehtet方法的对象
  return {
    gnirehtet,
  }
}
